gl shaders: unify frag coord handling
authorTimm Bäder <mail@baedert.org>
Sun, 10 May 2020 07:20:53 +0000 (09:20 +0200)
committerTimm Bäder <mail@baedert.org>
Sun, 10 May 2020 07:30:15 +0000 (09:30 +0200)
gsk/resources/glsl/border.glsl
gsk/resources/glsl/inset_shadow.glsl
gsk/resources/glsl/linear_gradient.glsl
gsk/resources/glsl/outset_shadow.glsl
gsk/resources/glsl/preamble.fs.glsl
gsk/resources/glsl/unblurred_outset_shadow.glsl

index 812d365431c57733053eb3d49e58545ac0d63d7d..894843cc50aaf3f5eeba8357f8ff4f6ebd8c1ec1 100644 (file)
@@ -32,12 +32,10 @@ _IN_ _ROUNDED_RECT_UNIFORM_ transformed_outside_outline;
 _IN_ _ROUNDED_RECT_UNIFORM_ transformed_inside_outline;
 
 void main() {
-  vec4 f = gl_FragCoord;
-  f.x += u_viewport.x;
-  f.y = (u_viewport.y + u_viewport.w) - f.y;
+  vec2 frag = get_frag_coord();
 
-  float alpha = clamp(rounded_rect_coverage(decode_rect(transformed_outside_outline), f.xy) -
-                      rounded_rect_coverage(decode_rect(transformed_inside_outline), f.xy),
+  float alpha = clamp(rounded_rect_coverage(decode_rect(transformed_outside_outline), frag) -
+                      rounded_rect_coverage(decode_rect(transformed_inside_outline), frag),
                       0.0, 1.0);
 
   setOutputColor(final_color * alpha);
index b3ba05a41ffc9aa5985dc8b4337a2f69a94a2a46..238540c7317a1211a1234c17e6586dcf46950357 100644 (file)
@@ -33,13 +33,10 @@ _IN_ _ROUNDED_RECT_UNIFORM_ transformed_outside_outline;
 _IN_ _ROUNDED_RECT_UNIFORM_ transformed_inside_outline;
 
 void main() {
-  vec4 f = gl_FragCoord;
+  vec2 frag = get_frag_coord();
 
-  f.x += u_viewport.x;
-  f.y = (u_viewport.y + u_viewport.w) - f.y;
-
-  float alpha = clamp (rounded_rect_coverage(decode_rect(transformed_outside_outline), f.xy) -
-                       rounded_rect_coverage(decode_rect(transformed_inside_outline), f.xy),
+  float alpha = clamp (rounded_rect_coverage(decode_rect(transformed_outside_outline), frag) -
+                       rounded_rect_coverage(decode_rect(transformed_inside_outline), frag),
                        0.0, 1.0);
 
   setOutputColor(final_color * alpha);
index 6814eed53fa970e4347dcb9c859007eb6b136296..cffe39294d563c0e744549f948232840dff9f4ee 100644 (file)
@@ -47,17 +47,9 @@ _IN_ float gradientLength;
 _IN_ vec4 color_stops[8];
 _IN_ float color_offsets[8];
 
-
-vec4 fragCoord() {
-  vec4 f = gl_FragCoord;
-  f.x += u_viewport.x;
-  f.y = (u_viewport.y + u_viewport.w) - f.y;
-  return f;
-}
-
 void main() {
   // Position relative to startPoint
-  vec2 pos = fragCoord().xy - startPoint;
+  vec2 pos = get_frag_coord() - startPoint;
 
   // Current pixel, projected onto the line between the start point and the end point
   // The projection will be relative to the start point!
index 4111ddcea850483cb815f22fe089a8639853cc17..40ef45f648f5f3b6b93ba3568fab8a99b1a778bc 100644 (file)
@@ -25,13 +25,10 @@ _IN_ vec4 final_color;
 _IN_ _ROUNDED_RECT_UNIFORM_ transformed_outline;
 
 void main() {
-  vec4 f = gl_FragCoord;
-
-  f.x += u_viewport.x;
-  f.y = (u_viewport.y + u_viewport.w) - f.y;
+  vec2 frag = get_frag_coord();
 
   float alpha = Texture(u_source, vUv).a;
-  alpha *= (1.0 -  clamp(rounded_rect_coverage(decode_rect(transformed_outline), f.xy), 0.0, 1.0));
+  alpha *= (1.0 -  clamp(rounded_rect_coverage(decode_rect(transformed_outline), frag), 0.0, 1.0));
 
   vec4 color = final_color * alpha;
 
index 5107470e00aa9f07c92fe79460b885ff62ac861b..cadbaf1331541980f941c1d701f858dee48cb78c 100644 (file)
@@ -84,19 +84,32 @@ vec4 Texture(sampler2D sampler, vec2 texCoords) {
 #endif
 }
 
-void setOutputColor(vec4 color) {
-  vec4 f = gl_FragCoord;
+#ifdef GSK_GL3
+layout(origin_upper_left) in vec4 gl_FragCoord;
+#endif
+
+vec2 get_frag_coord() {
+  vec2 fc = gl_FragCoord.xy;
+
+#ifdef GSK_GL3
+  fc += u_viewport.xy;
+#else
+  fc.x += u_viewport.x;
+  fc.y = (u_viewport.y + u_viewport.w) - fc.y;
+#endif
 
-  f.x += u_viewport.x;
-  f.y = (u_viewport.y + u_viewport.w) - f.y;
+  return fc;
+}
 
+void setOutputColor(vec4 color) {
+  vec2 f = get_frag_coord();
 
   // We do *NOT* transform the clip rect here since we already
   // need to do that on the CPU.
 #if defined(GSK_GLES) || defined(GSK_LEGACY)
-  gl_FragColor = color * rounded_rect_coverage(create_rect(u_clip_rect), f.xy);
+  gl_FragColor = color * rounded_rect_coverage(create_rect(u_clip_rect), f);
 #else
-  outputColor = color * rounded_rect_coverage(create_rect(u_clip_rect), f.xy);
+  outputColor = color * rounded_rect_coverage(create_rect(u_clip_rect), f);
 #endif
   /*outputColor = color;*/
 }
index 77c02be8e194d4e264ed9c966c78aab998ddbe89..419605e092fb11b48220f138b31e4db29a27fc8b 100644 (file)
@@ -33,13 +33,10 @@ _IN_ _ROUNDED_RECT_UNIFORM_ transformed_outside_outline;
 _IN_ _ROUNDED_RECT_UNIFORM_ transformed_inside_outline;
 
 void main() {
-  vec4 f = gl_FragCoord;
+  vec2 frag = get_frag_coord();
 
-  f.x += u_viewport.x;
-  f.y = (u_viewport.y + u_viewport.w) - f.y;
-
-  float alpha = clamp(rounded_rect_coverage(decode_rect(transformed_outside_outline), f.xy) -
-                      rounded_rect_coverage(decode_rect(transformed_inside_outline), f.xy),
+  float alpha = clamp(rounded_rect_coverage(decode_rect(transformed_outside_outline), frag) -
+                      rounded_rect_coverage(decode_rect(transformed_inside_outline), frag),
                       0.0, 1.0);
 
   setOutputColor(final_color * alpha);